text view: Use the drag-started signal
authorMatthias Clasen <mclasen@redhat.com>
Sun, 7 Jun 2015 16:46:11 +0000 (12:46 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 8 Jun 2015 10:55:21 +0000 (06:55 -0400)
Use the drag-started signal to differentiate between drags that
move a handle and taps on a handle. Show the touch selection popup
for the latter, but not the former.

gtk/gtktextview.c

index 9f794fc87c81e9e031a28c056c8ba6d08d50587d..c96cc148fd3456cda0b93d131c4f9cf42f4ec79c 100644 (file)
@@ -544,6 +544,9 @@ static void gtk_text_view_forall (GtkContainer *container,
                                   gpointer      callback_data);
 
 /* GtkTextHandle handlers */
+static void gtk_text_view_handle_drag_started  (GtkTextHandle         *handle,
+                                                GtkTextHandlePosition  pos,
+                                                GtkTextView           *text_view);
 static void gtk_text_view_handle_dragged       (GtkTextHandle         *handle,
                                                 GtkTextHandlePosition  pos,
                                                 gint                   x,
@@ -1626,6 +1629,8 @@ _gtk_text_view_ensure_text_handles (GtkTextView *text_view)
     return;
 
   priv->text_handle = _gtk_text_handle_new (GTK_WIDGET (text_view));
+  g_signal_connect (priv->text_handle, "drag-started",
+                    G_CALLBACK (gtk_text_view_handle_drag_started), text_view);
   g_signal_connect (priv->text_handle, "handle-dragged",
                     G_CALLBACK (gtk_text_view_handle_dragged), text_view);
   g_signal_connect (priv->text_handle, "drag-finished",
@@ -4850,11 +4855,17 @@ gtk_text_view_handle_dragged (GtkTextHandle         *handle,
         gtk_text_buffer_select_range (buffer, &cursor, &bound);
 
       if (_gtk_text_handle_get_is_dragged (priv->text_handle, cursor_pos))
-        gtk_text_view_scroll_mark_onscreen (text_view,
-                                            gtk_text_buffer_get_insert (buffer));
+        {
+          text_view->priv->cursor_handle_dragged = TRUE;
+          gtk_text_view_scroll_mark_onscreen (text_view,
+                                              gtk_text_buffer_get_insert (buffer));
+        }
       else
-        gtk_text_view_scroll_mark_onscreen (text_view,
-                                            gtk_text_buffer_get_selection_bound (buffer));
+        {
+          text_view->priv->selection_handle_dragged = TRUE;
+          gtk_text_view_scroll_mark_onscreen (text_view,
+                                              gtk_text_buffer_get_selection_bound (buffer));
+        }
     }
 
   if (_gtk_text_handle_get_is_dragged (priv->text_handle, cursor_pos))
@@ -4863,15 +4874,22 @@ gtk_text_view_handle_dragged (GtkTextHandle         *handle,
     gtk_text_view_show_magnifier (text_view, &bound, x, y);
 }
 
+static void
+gtk_text_view_handle_drag_started (GtkTextHandle         *handle,
+                                   GtkTextHandlePosition  pos,
+                                   GtkTextView           *text_view)
+{
+  text_view->priv->cursor_handle_dragged = FALSE;
+  text_view->priv->selection_handle_dragged = FALSE;
+}
+
 static void
 gtk_text_view_handle_drag_finished (GtkTextHandle         *handle,
                                     GtkTextHandlePosition  pos,
                                     GtkTextView           *text_view)
 {
-  if (text_view->priv->selection_bubble &&
-      gtk_widget_get_visible (text_view->priv->selection_bubble))
-    gtk_text_view_selection_bubble_popup_unset (text_view);
-  else
+  if (!text_view->priv->cursor_handle_dragged &&
+      !text_view->priv->selection_handle_dragged)
     gtk_text_view_selection_bubble_popup_set (text_view);
 
   if (text_view->priv->magnifier_popover)